/**
 * 对给定数组进行去重处理
 * @param {Array} arr - 需要去重的数组
 * @returns {Array} 去重后的数组
 */
export function uniquelize(arr: any) {
  return [...new Set(arr)]
}

/**
 * 将给定字符串的首字母转换为大写
 * @param {string} str - 需要转换的字符串
 * @returns {string} 首字母大写后的字符串，如果字符串为空则返回空字符串
 */
export const toUpperCase = (str: string) => {
  if (str[0]) {
    return str.replace(str[0], str[0].toUpperCase())
  } else {
    return ""
  }
}

/**
 * 将给定字符串的首字母转换为小写
 * @param {string} str - 需要转换的字符串
 * @returns {string} 首字母小写后的字符串，如果字符串为空则返回空字符串
 */
export const toLowerCase = (str: string) => {
  if (str[0]) {
    return str.replace(str[0], str[0].toLowerCase())
  } else {
    return ""
  }
}

/**
 * 将驼峰命名法转换为下划线命名法
 * @param {string} str - 需要转换的字符串
 * @returns {string} 转换后的字符串，如果输入为'ID'则直接返回'ID'
 */
export const toSQLLine = (str: string) => {
  if (str === "ID") return "ID"
  return str.replace(/([A-Z])/g, "_$1").toLowerCase()
}

/**
 * 将下划线命名法转换为驼峰命名法
 * @param {string} name - 需要转换的字符串
 * @returns {string} 转换后的字符串
 */
export const toHump = (name: string) => {
  return name.replace(/\_(\w)/g, function (all, letter) {
    return letter.toUpperCase()
  })
}

export function generateUUID(includeDashes: boolean = false): string {
  let d = new Date().getTime()
  if (window.performance && typeof window.performance.now === "function") {
    d += performance.now() // 使用高精度计时器（如果可用）
  }
  const uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
    /[xy]/g,
    function (c) {
      const r = (d + Math.random() * 16) % 16 | 0
      d = Math.floor(d / 16)
      return (c === "x" ? r : (r & 0x3) | 0x8).toString(16)
    },
  )

  return includeDashes ? uuid : uuid.replace(/-/g, "")
}

//手机号加星，支持境外手机
export function maskPhoneNumber(phoneNumber: string = ''): string {
  // 去除手机号中的空格和特殊字符
  const cleanedNumber = phoneNumber.replace(/\D/g, '');

  // 检查手机号长度是否至少为8位
  if (cleanedNumber.length < 8) {
    console.warn("手机号长度不足8位，无法进行有效遮罩");
    return phoneNumber;
  }

  // 使用正则表达式匹配前3位和后4位，中间部分用星号替换
  const maskedNumber = cleanedNumber.replace(
      /^(\d{3})(\d+)(\d{4})$/,
      (match, prefix, middle, suffix) => `${prefix}${'*'.repeat(middle.length)}${suffix}`
  );

  // 保留原始手机号的非数字字符
  let maskedIndex = 0;
  let result = '';
  for (let i = 0; i < phoneNumber.length; i++) {
    if (/\D/.test(phoneNumber[i])) {
      result += phoneNumber[i];
    } else {
      result += maskedNumber[maskedIndex++];
    }
  }

  return result;
}